function PhpSerialize (mixed_value)
{
	var _getType = function (inp) {
		var type = typeof inp, match;
		var key;
		if (type == 'object' && !inp) {
			return 'null';
		}
		if (type == "object") {
			if (!inp.constructor) {
				return 'object';
			}
			var cons = inp.constructor.toString();
			match = cons.match(/(\w+)\(/);
			if (match) {
				cons = match[1].toLowerCase();
			}
			var types = ["boolean", "number", "string", "array"];
			for (key in types) {
				if (cons == types[key]) {
					type = types[key];
					break;
				}
			}
		}
		return type;
	};
	var type = _getType(mixed_value);
	var val, ktype = '';

	switch (type) {
		case "function":
			val = "";
			break;
		case "boolean":
			val = "b:" + (mixed_value ? "1" : "0");
			break;
		case "number":
			val = (Math.round(mixed_value) == mixed_value ? "i" : "d") + ":" + mixed_value;
			break;
		case "string":
			val = "s:" + encodeURIComponent(mixed_value).replace(/%../g, 'x').length + ":\"" + mixed_value + "\"";
			break;
		case "array":
		case "object":
			val = "a";
			var count = 0;
			var vals = "";
			var okey;
			var key;
			for (key in mixed_value) {
				ktype = _getType(mixed_value[key]);
				if (ktype == "function") {
					continue;
				}

				okey = (key.match(/^[0-9]+$/) ? parseInt(key, 10) : key);
				vals += this.PhpSerialize(okey) +
				this.PhpSerialize(mixed_value[key]);
				count++;
			}
			val += ":" + count + ":{" + vals + "}";
			break;
		case "undefined": // Fall-through
		default: // if the JS object has a property which contains a null value, the string cannot be unserialized by PHP
			val = "N";
			break;
	}
	if (type != "object" && type != "array") {
		val += ";";
	}
	return val;
}

function PhpUnserialize (data) {
		var that = this;
    var utf8Overhead = function (chr) {
        var code = chr.charCodeAt(0);        if (code < 0x0080) {
            return 0;
        }
        if (code < 0x0800) {
            return 1;        }
        return 2;
    };

		var utf8_decode = function (str_data) {
						i = 0,
						ac = 0,
						c1 = 0,
						c2 = 0,
						c3 = 0;
						tmp_arr = new Array();

				str_data += '';

				while (i < str_data.length)
				{
						c1 = str_data.charAt(i);
						tmp_arr[ac++] = c1;
						i++;
				}
/*	zmenil David Stanke 6.5.2011 - binarni posuv mrsil cestinu. Ale prece to tu nedaly jen ze srandy?
				while (i < str_data.length) {        c1 = str_data.charCodeAt(i);
						if (c1 < 128) {
								tmp_arr[ac++] = String.fromCharCode(c1);
								i++;
						} else if (c1 > 191 && c1 < 224) {            c2 = str_data.charCodeAt(i + 1);
								tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
								i += 2;
						} else {
								c2 = str_data.charCodeAt(i + 1);            c3 = str_data.charCodeAt(i + 2);
								tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
								i += 3;
						}
				}
*/
				return tmp_arr.join('');
		};
     var error = function (type, msg, filename, line) {
        throw new that.window[type](msg, filename, line);
    };
    var read_until = function (data, offset, stopchr) {
        var buf = [];        var chr = data.slice(offset, offset + 1);
        var i = 2;
        while (chr != stopchr) {
            if ((i + offset) > data.length) {
                error('Error', 'Invalid');            }
            buf.push(chr);
            chr = data.slice(offset + (i - 1), offset + i);
            i += 1;
        }        return [buf.length, buf.join('')];
    };
    var read_chrs = function (data, offset, length) {
        var buf;
         buf = [];
        for (var i = 0; i < length; i++) {
            var chr = data.slice(offset + (i - 1), offset + i);
            buf.push(chr);
            length -= utf8Overhead(chr);        }
        return [buf.length, buf.join('')];
    };
    var _unserialize = function (data, offset) {
        var readdata;        var readData;
        var chrs = 0;
        var ccount;
        var stringlength;
        var keyandchrs;        var keys;

        if (!offset) {
            offset = 0;
        }        var dtype = (data.slice(offset, offset + 1)).toLowerCase();

        var dataoffset = offset + 2;
        var typeconvert = function (x) {
            return x;        };

        switch (dtype) {
        case 'i':
            typeconvert = function (x) {                return parseInt(x, 10);
            };
            readData = read_until(data, dataoffset, ';');
            chrs = readData[0];
            readdata = readData[1];            dataoffset += chrs + 1;
            break;
        case 'b':
            typeconvert = function (x) {
                return parseInt(x, 10) !== 0;            };
            readData = read_until(data, dataoffset, ';');
            chrs = readData[0];
            readdata = readData[1];
            dataoffset += chrs + 1;            break;
        case 'd':
            typeconvert = function (x) {
                return parseFloat(x);
            };            readData = read_until(data, dataoffset, ';');
            chrs = readData[0];
            readdata = readData[1];
            dataoffset += chrs + 1;
            break;        case 'n':
            readdata = null;
            break;
        case 's':
            ccount = read_until(data, dataoffset, ':');            chrs = ccount[0];
            stringlength = ccount[1];
            dataoffset += chrs + 2;

            readData = read_chrs(data, dataoffset + 1, parseInt(stringlength, 10));            chrs = readData[0];
            readdata = readData[1];
            dataoffset += chrs + 2;
            if (chrs != parseInt(stringlength, 10) && chrs != readdata.length) {
                error('SyntaxError', 'String length mismatch');            }

            // Length was calculated on an utf-8 encoded string
            // so wait with decoding
            readdata = utf8_decode(readdata);            break;
        case 'a':
            readdata = {};

            keyandchrs = read_until(data, dataoffset, ':');            chrs = keyandchrs[0];
            keys = keyandchrs[1];
            dataoffset += chrs + 2;

            for (var i = 0; i < parseInt(keys, 10); i++) {                var kprops = _unserialize(data, dataoffset);
                var kchrs = kprops[1];
                var key = kprops[2];
                dataoffset += kchrs;
                 var vprops = _unserialize(data, dataoffset);
                var vchrs = vprops[1];
                var value = vprops[2];
                dataoffset += vchrs;
                 readdata[key] = value;
            }

            dataoffset += 1;
            break;        default:
            error('SyntaxError', 'Unknown / Unhandled data type(s): ' + dtype);
            break;
        }
        return [dtype, dataoffset - offset, typeconvert(readdata)];    };

    return _unserialize((data + ''), 0)[2];
}
	
///univerazalni, nepatri do DA - využívá pinkbutik
if(typeof String.prototype.trim !== 'function')
  String.prototype.trim = function() { return this.replace(/^\s+|\s+$/, ''); }

function DirectAjaxCore()
{
	var argumenty=new Object();
	var cilovyDiv=arguments[1];
	var asynchronost=arguments[3];
	var parametry=(arguments[2]!="")?$('#'+arguments[2]).serialize():"";
	var preloaderBarVyska = 0;

	for(var i=4; i<arguments.length; i++)
	{
		if (typeof arguments[i] == 'function' || (typeof arguments[i] == 'object' && arguments[i].toString().substr(0, 8) == 'function'))
			var userCallBackFunction=arguments[i];
		else if (typeof arguments[i] == 'object')
			parametry+=(parametry!=""?"&":"")+$.param(arguments[i]);
		else if(arguments[i].substr(0,13)=="js_preloader=")
		{
			//vytvoreni preloaderu
			var preloaderBar = document.createElement('div');
			$(preloaderBar).css('background', 'url('+arguments[i].substr(13)+') no-repeat center center');
			//vytvoreni preloaderu---end
		}
		else if(arguments[i].substr(0,13)=="js_preheight=")
		{
			//vytvoreni preloaderu maunal vysky
			preloaderBarVyska = arguments[i].substr(13);
			//vytvoreni preloaderu maunal vysky---end
		}
		else if(arguments[i].toLowerCase()=="prictikcily=true")
			var prictiKCily=true;
		else
			argumenty[arguments[i].substr(0, arguments[i].indexOf('='))]=arguments[i].substr(arguments[i].indexOf('=')+1);
	}
	var argumentySer=$.param(argumenty);
	if(argumentySer!="")
		parametry+=(parametry!=""?"&":"")+argumentySer;

	var vysledek=$.ajax({
		url: arguments[0],
		type: 'post',
		data: parametry,
		async: asynchronost,
		beforeSend: function(){
			try
			{
				if(preloaderBar)
				{
					if(preloaderBarVyska<1) {
						preloaderBarVyska = $('#'+cilovyDiv).height();
						if(preloaderBarVyska<64)
							preloaderBarVyska=64;
					}
					$(preloaderBar).css('height', preloaderBarVyska+'px');

					if(prictiKCily)
						$(preloaderBar).slideDown('fast');
					else
						$('#'+cilovyDiv).html('');

					$('#'+cilovyDiv).append(preloaderBar);
				}
			}
			catch(e){}
		},
		success: function(data){
			if(asynchronost)
			{
				try
				{
					if(prictiKCily)
					{
						if(preloaderBar) 
							window.document.getElementById(cilovyDiv).removeChild(preloaderBar);
        		$("#"+cilovyDiv).append(data);
				}
					else
						window.document.getElementById(cilovyDiv).innerHTML=data;
				}
				catch(e){}
			}
		try{
			userCallBackFunction(data)
			}catch(e){}
			try{
				if(LOCAL==1 && cilovyDiv=='')window.document.getElementById('ajaxdebug').innerHTML=data;
			}catch(e){}
		},
		dataType: 'html'
});

if(asynchronost)
	return(true);
else
	return(vysledek);
}

/**
  * bool DirectAjax(adresaDireckCall, cilovyDiv, zdrojovyFormular [,'idetifier=X' [,function(){UserCallBack()}] [,prictiKCily=true] [,'param=X']])
  */
function DirectAjax()
{
	var args=[];
	for(var i=0;i<3;i++)
		args.push(arguments[i]);

	args.push(true);

	for(var i=3;i<arguments.length;i++)
		args.push(arguments[i]);

	return(DirectAjaxCore.apply(this,args));
}

/**
  * string DirectAjax(adresaDireckCall, zdrojovyFormular [,'idetifier=X' [,'param=X']])
  */
function DirectAjaxData()
{
	var args=[];

	args.push(arguments[0]);
	args.push("");
	args.push(arguments[1]);
	args.push(false);

	for(var i=2;i<arguments.length;i++)
		args.push(arguments[i]);

	var vysledek=DirectAjaxCore.apply(this,args);

	if(vysledek.status==200)
		return (vysledek.responseText);
	else
		return (false);
}

